//引入依赖的配置文件模块
require(["config"],function(){
	//引入依赖文件
	require(["template","jquery","header","cookie"],function(template,$,){
		function Cart(){
			this.products = null;
			this.load();
			this.addListener();
		}
		Cart.prototype = {
			constructor: Cart,
			// 加载，渲染页面，如果有选购的购物车商品，
			// 则显示商品信息，如果没有，则显示空的提示
			load: function(){
				// 配置 cookie 插件自动转换 JS 与 JSON
				$.cookie.json = true;
				//读取cookie中的数据
				var products = this.products = $.cookie("cart") || [];
				// 判断是否有购物车商品
				if (products.length === 0) { // 购物车为空
					//找到class为empty的dom元素，将他显示，将他的兄弟元素中的class中的not-empty的元素隐藏
					$(".hll_gwc3").show().siblings(".cart_list").hide();
					return;
				}
				//源代码中 hidden中 权重为最高级 调用show函数 不行 权重不够
				$(".hll_gwc3").hide().siblings(".cart_list").removeClass("hidden");
				$(".hll_gwc3").hide().siblings(".cart_list").show();
				//渲染模板
				var data = {products:products},
					html = template("template_cart", data);
				$(".cart_list tbody").html(html);
				//计算合计金额
				this.calcTotal();
				this.h_amount();
				this.cart_animate()
			},
			//注册事件监听
			addListener: function(){
				//del删除
				$(".cart_list tbody").on("click", ".del", $.proxy(this.delHandler, this));
				// +/-数量
				$(".cart_list tbody").on("click", ".decrement,.increment", $.proxy(this.decIncHandler, this));
				//输入改变数量
				$(".cart_list tbody").on("blur", ".amount", $.proxy(this.inputHandler, this));
				// 全选
				$(".ckeck_all").on("click", $.proxy(this.ckAllHandler, this));
				// 部分选中
				$(".cart_list tbody").on("click", ".ck_prod", $.proxy(this.ckProdHandler, this));
				//一键删除
				$(".del_ids").on("click", $.proxy(this.alldel, this));
				
			},
			//del删除
			delHandler:function(event){
				//获取事件源元素（dom元素）
				var src = event.target;
				//获取事件源元素所在行（jquery对象）
				var tr = $(src).parents("tr");//在$(src)元素中的祖先元素的找到tr元素
				// 获取商品 id
				var id = tr.find(".id").text();//在tr的所有后代中找到id元素
				var desc = tr.find(".title").text();//在tr的所有后代中找到id元素
				/**
				 * 通过filter来过滤掉删除的id数组
				 * @filter 为false的则过滤掉//不同写法
				 * this.products = this.products.filter(function(prod) {
				 * return !(prod.id == id);
				 * 	//if (prod.id == id)
				 * 	//	return false;
				 * 	//return true;
				 * });
				 */
				//从数组中删除该 id 对应的商品对象
				this.products = this.products.filter(prod=>!(prod.id == id && prod.desc == desc));
				
				// 从 cookie 中保存的购物车结构中删除商品数据//覆盖修改
				$.cookie("cart", this.products, {expires: 10, path: "/"});
				// 从 DOM 树中删除 DOM 行结构
				tr.remove();//自己删除自己
				//计算合计金额
				this.calcTotal();
				// 判断是否有购物车商品
				if (this.products.length === 0) { // 购物车为空
					$(".hll_gwc3").show().siblings(".cart_list").hide();
				}
				this.calcTotal();
				this.h_amount();
				
				
			},
			//+/-
			decIncHandler:function(event){
				// 事件源元素（DOM）
				var src = event.target;
				//获取事件源元素所在行（jquery对象）
				var tr = $(src).parents("tr");//在$(src)元素中的祖先元素的找到tr元素
				// 获取商品 id
				var id = tr.find(".id").text();//在tr的所有后代中找到id元素
				//从数组中删除该 id 对应的商品对象
				//通过id过滤 返回一个数组 这个数组里面只有一个元素
				var product = this.products.filter(prod=>(prod.id == id))[0];
				// 判断+/-数量
				if($(src).is(".decrement")){// - 操作
					if(product.amount <= 1)
						return;
					product.amount--;
				}else{// + 操作
					product.amount++;
				}
				// 保存到 cookie 中（修改数量后的数组）
				$.cookie("cart", this.products, {expires: 10, path: "/"});
				// 页面渲染
				//数量
				tr.find(".amount").val(product.amount);
				//小计
				tr.find(".sub").text((product.amount*product.price).toFixed(2));
				//计算合计金额
				this.calcTotal();
				this.h_amount();
				
				
			},
			//输入改变数量
			inputHandler: function(event){
				// 事件源元素（DOM）
				var src = event.target;
				//获取事件源元素所在行（jquery对象）
				var tr = $(src).parents("tr");//在$(src)元素中的祖先元素的找到tr元素
				// 获取商品 id
				var id = tr.find(".id").text();//在tr的所有后代中找到id元素
				//从数组中删除该 id 对应的商品对象
				//通过id过滤 返回一个数组 这个数组里面只有一个元素
				var product = this.products.filter(prod=>(prod.id == id))[0];
				//修改数量
				//获取amount数量进行判断 是否格式有误
				var _amount = $(src).val();
				var reg = /^[1-9]\d*$/;
				if (!reg.test(_amount)) { // 格式有误，则还原为原有数量值 结束函数操作
					$(src).val(product.amount);
					return;
				}
				product.amount = _amount;
				// 保存到 cookie 中（修改数量后的数组）
				$.cookie("cart", this.products, {expires: 10, path: "/"});
				// 页面渲染
				//数量
				tr.find(".amount").val(product.amount);
				//小计
				tr.find(".sub").text((product.amount*product.price).toFixed(2));
				//计算合计金额
				this.calcTotal();
				this.h_amount();
				
				
			},
			// 计算选中行的合计金额
			calcTotal: function(){
				var sum = 0;
				//选中勾选框后的合计金额
				$(".ck_prod:checked").each(function(index, element){
					sum += Number($(this).parents("tr").find(".sub").text());
				});
				$(".cart_sum").text(sum.toFixed(2));
				
			},
			// 全选处理
			ckAllHandler: function(event) {
				var status = $(event.target).prop("checked")
				// 将各商品行前复选框选中状态设置为全选的选中状态
				$(".ck_prod").prop("checked", status);
				// 计算合计
				this.calcTotal();
			},
			// 部分选中处理
			ckProdHandler:function(event){
				// 获取购物车主体中选中的复选框个数
				var count = $(".ck_prod:checked").length;
				// 设置全选复选框选中状态
				var status = count === this.products.length;
				$(".ckeck_all").prop("checked", status);

				// 计算合计
				this.calcTotal();
			},
			//头部显示购物车数量
			h_amount:function(){
				//保存总数据在sum，cookie中
				var sum_amount =0;
				$.each(this.products,function(index,curr){
					sum_amount = sum_amount + Number(curr.amount);
				});
				$.cookie("sum", sum_amount, {expires: 10, path:"/"});
				//页面数据渲染
				$(".head_amount").text(sum_amount);
			},
			cart_animate:function(){
				var left = $(".Carousel").position().left;
				setInterval(function(){
					if(left==0){
						$(".Carousel").animate({left: -335+"px"}, 1000 );
						$(".Carousel").animate({left: -335+"px"}, 2000 );
						$(".Carousel").animate({left: 0+"px"}, 1000 );
						$(".Carousel").animate({left: 0+"px"}, 2000 );
					}
				},1000);
			},
			//删除选中
			alldel:function(){
				var bufen = $(".ck_prod:checked");
				console.log(this.products);
				console.log(bufen);
				bufen.each((index,curr) => { 
//					let id = $(bufen[index]).parents("tr").find(".id");
					let id = $(bufen[index]).parents("tr").find(".id").text();
					let desc = $(bufen[index]).parents("tr").find(".title").text();
					console.log("id=" + id +"  "+ desc);
					this.products = this.products.filter(prod=>!(prod.id == id && prod.desc == desc));
					console.log(this.products);
					location = "/html/cart.html";
				});
				var sum_amount =0;
				$.each(this.products,function(index,curr){
					sum_amount = sum_amount + Number(curr.amount);
				});
				$.cookie("sum", sum_amount, {expires: 10, path:"/"});
				//页面数据渲染
				$(".head_amount").text(sum_amount);
				$.cookie("cart", this.products, {expires: 10, path: "/"});
			}
		}
		new Cart(); 
		
	});
});